/**
 * @file File.h
 * @author shikang999@126.com
 * @brief 一个文件读写类
 * @version 0.1
 * @date 2025-06-21
 * 
 * @copyright Copyright (c) 2025
 * 
 */
#pragma once
#include <string>
#include <vector>
#include <fstream>
#include <cstdint>

class File
{
public:
    File();
    ~File();

    //读文件
    bool openForRead(const std::string &f);

    //写文件
    bool openForWrite(const std::string &f);

    //获取文件长度, 执行这个函数前 openForRead 必须返回True
    std::size_t getLength();

    void close();

    //将内存数据刷入磁盘文件, 执行这个函数前 openForWrite 必须返回True
    void flush();

    //写n个字节, 执行这个函数前 openForWrite 必须返回True
    void writeChars(const char * c, uint32_t n);

    //读n个字节,  执行这个函数前 openForRead 必须返回True
    void readChars(char *c, uint32_t n);

    //写字符串, 执行这个函数前 openForWrite 必须返回True
    void writeString(const std::string &s);

    //读字符串, 执行这个函数前 openForRead 必须返回True
    std::string readString();

    //写数据, 执行这个函数前 openForWrite 必须返回True
    template<typename T>
    void write(T v)
    {
        fw_.write((char *)&v, sizeof(T));
    }

    //读数据, 执行这个函数前 openForRead 必须返回True
    template <typename T>
    T read()
    {
        char p[sizeof(T)];
        fr_.read(p, sizeof(T));
        return *reinterpret_cast<T*>(p);
    }

private:
    std::size_t length_;
    std::ofstream fw_;
    std::ifstream fr_;
};